package com.jdbc.jdbc;

import org.junit.Test;

import java.sql.*;

/**
 * JDBC-5
 * Description:
 *      1. 通过PreparedStatement返回插入数据对应的自增主键
 *      2. 批量插入数据
 */
public class JdbcBatchInsert {

    /**
     * 返回新插入数据的自增生成的主键值
     * 1. 创建PreparedStatement时，指定参数要返回主键
     * 2. 获取结果后，移动游标获取主键值
     *
     * @throws Exception
     */
    @Test
    public void returnPrimaryKey() throws Exception{

        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql:///jdbc?user=root&password=root");
        //3.编写SQL语句结构
        String sql = "insert into t_user (account,password,nickname) values (?,?,?);";
        //4.创建预编译的statement
        /**
         * TODO: 第二个参数填入 1 | Statement.RETURN_GENERATED_KEYS
         *       告诉statement携带回数据库生成的主键
         */
        PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

        //5.占位符赋值
        statement.setObject(1,"dog");
        statement.setObject(2,"123456");
        statement.setObject(3,"二狗子");

        //6.执行SQL语句
        // TODO:【注意：PreparedStatement执行方法不需要传入SQL语句】 DML
        int rows = statement.executeUpdate();

        //7.结果集解析
        System.out.println("rows = " + rows);

        // 通过prepareStatement获取主键值，返回结构化的行列数据
        ResultSet resultSet = statement.getGeneratedKeys();
        // 先移动游标，指向第一行数据
        resultSet.next();
        // 再获取第一个数值，得到主键
        int key = resultSet.getInt(1);
        System.out.println("key = " + key);

        //8.释放资源
        statement.close();
        connection.close();
    }


    /**
     * 批量插入数据：
     *    1.在url添加固定参数值 url?rewriteBatchedStatements=true
     *    2.编写SQL语句时，insert 语句必须使用 values
     *    3.编写SQL语句时，语句后面不能添加分号;
     *    4.语句不能直接执行，每次需要先追加  addBatch() 后 executeBatch();
     *
     * @throws Exception
     */
    @Test
    public void batchInsertYH() throws Exception{

        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接，连接追加批量操作参数开关
        Connection connection = DriverManager.getConnection(
                "jdbc:mysql:///jdbc?rewriteBatchedStatements=true",
                "root","root");
        //3.编写SQL语句结构，values 且无;分号
        String sql = "insert into t_user (account,password,nickname) values (?,?,?)";

        // 获取系统时间，判断效率
        long start = System.currentTimeMillis();

        //4.创建预编译的statement，传入SQL语句结构
        PreparedStatement statement = connection.prepareStatement(sql);

        //5.占位符赋值
        for (int i = 0; i < 10000; i++) {
            statement.setObject(1,"ergouzi"+i);
            statement.setObject(2,"lvdandan");
            statement.setObject(3,"驴蛋蛋"+i);
            //6.完成一条语句的赋值后，必须先追加语句
            statement.addBatch();
        }

        //执行批量操作
        statement.executeBatch();

        // 操作结束时间
        long end = System.currentTimeMillis();

        //7.结果集解析
        System.out.println("批量插入10000条数据消耗时间："+(end - start)); // 消耗时间：540ms

        //8.释放资源
        statement.close();
        connection.close();
    }

}
